import request from '@/utils/request'
import { encrypt } from '@/utils/auth'

/**
 * 获取公钥
 * 
 * 返回公钥
 * 
 * @returns {promises} 公钥
 */
export function getPublicKey () {
  return request({
    url: '/auth/getPublicKey',
    method: 'get'
  })
}

/**
 * 用户登陆
 * 
 * 封装用户名、密码（未加密）、是否记住我为对象传入
 * 
 * 成功返回登陆后的token，失败返回错误信息
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.username - 用户名
 * @param {string} data.password - 密码
 * @param {boolean} data.remenberMe - 是否记住我
 * @returns {promises} 登陆后的token或登陆失败提示
 */
export async function login (data) {
  return request({
    url: '/auth/login',
    method: 'post',
    data: {
      username: data.username,
      password: encrypt(data.password, data.publicKey),
      remenberMe: data.remenberMe
    }
  })
}

/**
 * 用户注册
 * 
 * 封装昵称、用户名、密码（未加密）、确认密码（未加密）为对象传入
 * 
 * 返回注册成功或失败的提示
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.nickname - 昵称
 * @param {string} data.username - 用户名
 * @param {string} data.password - 密码
 * @param {string} data.confirmPassword - 确认密码
 * @returns {promises} 注册成功或失败提示
 */
export async function register (data) {
  return request({
    url: '/auth/register',
    method: 'post',
    data: {
      nickname: data.nickname,
      username: data.username,
      password: encrypt(data.password, data.publicKey),
      confirmPassword: encrypt(data.confirmPassword, data.publicKey)
    }
  })
}

/**
 * 用户登出
 * 
 * 传入token
 * 
 * 从本地以及服务器删除token
 * 
 * @param {string} token - token
 * @returns {promises} 登出成功提示
 */
export function logout (token) {
  return request({
    url: `/auth/logout?authToken${token}`,
    method: 'get'
  })
}

/**
 * 分页查询权限
 * 
 * 封装必选的分页参数和可选的查询参数为一个对象传入
 * 
 * 分页参数：页码号、页大小，页码号小于1从1开始
 * 
 * 查询参数：权限码、权限描述、权限名称、状态
 * 
 * 返回结果为分页权限对象
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.pageNum - 页码号
 * @param {string} data.pageSize - 页大小
 * @param {string} data.permissionCode - 权限码
 * @param {string} data.permissionDesc - 权限描述
 * @param {string} data.permissionName - 权限名称
 * @param {string} data.startTime - 创建开始时间
 * @param {string} data.endTime - 创建结束时间
 * @param {string} data.status - 状态
 * @returns {promises} 分页权限对象
 */

export function getPermissionPage (data) {
  return request({
    url: '/permission/page',
    method: 'post',
    data: {
      pageNum: data.pageNum,
      pageSize: data.pageSize,
      permissionCode: data.permissionCode,
      permissionDesc: data.permissionDesc,
      permissionName: data.permissionName,
      startTime: data.createTimeStartAndEnd ? data.createTimeStartAndEnd[0] : null,
      endTime: data.createTimeStartAndEnd ? data.createTimeStartAndEnd[1] : null,
      status: data.status
    }
  })
}

/**
 * 分页新增权限
 * 
 * 封装新增权限表单参数为一个对象传入
 * 
 * 新增权限表单参数：权限码、权限描述、权限名称
 * 
 * 返回结果为新增成功或失败提示
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.permissionCode - 权限码
 * @param {string} data.permissionDesc - 权限描述
 * @param {string} data.permissionName - 权限名称
 * @returns {promises} 新增成功或失败的提示
 */
export function addPermission (data) {
  return request({
    url: '/permission/add',
    method: 'post',
    data: {
      permissionCode: data.permissionCode,
      permissionDesc: data.permissionDesc,
      permissionName: data.permissionName,
    }
  })
}

/**
 * 修改权限信息
 * 
 * 封装权限id和修改权限表单参数以及初始参数为一个对象传入
 * 
 * 修改权限表单参数：权限码、权限描述、权限名称，为空就是不修改
 * 
 * 返回结果为修改成功或失败的提示
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.id - 权限id
 * @param {string} data.permissionCode - 权限码
 * @param {string} data.permissionDesc - 权限描述
 * @param {string} data.permissionName - 权限名称
 * @param {string} data.oldPermissionCode - 初始权限码
 * @param {string} data.oldPermissionDesc - 初始权限描述
 * @param {string} data.oldPermissionName - 初始权限名称
 * 
 * @returns {promises} 修改成功或失败的提示
 */
export function updatePermission (data) {
  return request({
    url: '/permission/update',
    method: 'put',
    data: {
      id: data.id,
      permissionCode: data.permissionCode === data.oldPermissionCode ? null : data.permissionCode,
      permissionDesc: data.permissionDesc === data.oldPermissionDesc ? null : data.permissionDesc,
      permissionName: data.permissionName === data.oldPermissionName ? null : data.permissionName,
    }
  })
}

/**
 * 修改权限状态
 * 
 * 封装权限id和权限状态为一个对象传入
 * 
 * 返回结果为修改成功或失败的提示
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.id - 权限id
 * @param {string} data.status - 权限状态
 * @returns {promises} 修改成功或失败的提示
 */
export function updatePermissionStatus (data) {
  return request({
    url: '/permission/update',
    method: 'put',
    data: {
      id: data.id,
      status: data.status
    }
  })
}

/**
 * 删除权限
 * 
 * 传入权限id，单个直接传，多个封装成数组
 * 
 * 返回结果为删除成功或失败的提示
 * 
 * @param {(string | Array)} ids - 权限id
 * @returns {promises} 删除成功或失败的提示
 */
export function deletePermission (ids) {
  return request({
    url: '/permission/delete',
    method: 'delete',
    data: Array.isArray(ids) ? ids : [ids]
  })
}

/**
 * 分页查询角色
 * 
 * 封装必选的分页参数和可选的查询参数为一个对象传入
 * 
 * 分页参数：页码号、页大小，页码号小于1从1开始
 * 
 * 查询参数：角色码、角色描述、角色名称、状态
 * 
 * 返回结果为分页角色对象
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.pageNum - 页码号
 * @param {string} data.pageSize - 页大小
 * @param {string} data.roleCode - 角色码
 * @param {string} data.roleDesc - 角色描述
 * @param {string} data.roleName - 角色名称
 * @param {string} data.startTime - 创建开始时间
 * @param {string} data.endTime - 创建结束时间
 * @param {string} data.status - 状态
 * @returns {promises} 分页角色对象
 */
export function getRolePage (data) {
  return request({
    url: '/role/page',
    method: 'post',
    data: {
      pageNum: data.pageNum,
      pageSize: data.pageSize,
      roleCode: data.roleCode,
      roleDesc: data.roleDesc,
      roleName: data.roleName,
      startTime: data.createTimeStartAndEnd ? data.createTimeStartAndEnd[0] : null,
      endTime: data.createTimeStartAndEnd ? data.createTimeStartAndEnd[1] : null,
      status: data.status
    }
  })
}

/**
 * 分页新增角色
 * 
 * 封装新增角色表单参数为一个对象传入
 * 
 * 新增角色表单参数：角色码、角色描述、角色名称
 * 
 * 返回结果为新增成功或失败提示
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.roleCode - 角色码
 * @param {string} data.roleDesc - 角色描述
 * @param {string} data.roleName - 角色名称
 * @returns {promises} 新增成功或失败的提示
 */
export function addRole (data) {
  return request({
    url: '/role/add',
    method: 'post',
    data: {
      roleCode: data.roleCode,
      roleDesc: data.roleDesc,
      roleName: data.roleName,
    }
  })
}

/**
 * 修改角色信息
 * 
 * 封装角色id和修改角色表单参数以及初始参数为一个对象传入
 * 
 * 修改角色表单参数：角色码、角色描述、角色名称，为空就是不修改
 * 
 * 返回结果为修改成功或失败的提示
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.id - 角色id
 * @param {string} data.roleCode - 角色码
 * @param {string} data.roleDesc - 角色描述
 * @param {string} data.roleName - 角色名称
 * @param {string} data.oldRoleCode - 初始角色码
 * @param {string} data.oldRoleDesc - 初始角色描述
 * @param {string} data.oldRoleName - 初始角色名称
 * 
 * @returns {promises} 修改成功或失败的提示
 */
export function updateRole (data) {
  return request({
    url: '/role/update',
    method: 'put',
    data: {
      id: data.id,
      roleCode: data.roleCode === data.oldRoleCode ? null : data.roleCode,
      roleDesc: data.roleDesc === data.oldRoleDesc ? null : data.roleDesc,
      roleName: data.roleName === data.oldRoleName ? null : data.roleName,
    }
  })
}

/**
 * 修改角色状态
 * 
 * 封装角色id和角色状态为一个对象传入
 * 
 * 返回结果为修改成功或失败的提示
 * 
 * @param {object} data - 封装好的对象
 * @param {string} data.id - 角色id
 * @param {string} data.status - 角色状态
 * @returns {promises} 修改成功或失败的提示
 */
export function updateRoleStatus (data) {
  return request({
    url: '/role/update',
    method: 'put',
    data: {
      id: data.id,
      status: data.status
    }
  })
}

/**
 * 删除角色
 * 
 * 传入角色id，单个直接传，多个封装成数组
 * 
 * 返回结果为删除成功或失败的提示
 * 
 * @param {(string | Array)} ids - 角色id
 * @returns {promises} 删除成功或失败的提示
 */
export function deleteRole (ids) {
  return request({
    url: '/role/delete',
    method: 'delete',
    data: Array.isArray(ids) ? ids : [ids]
  })
}

/**
 * 给角色添加权限
 * 
 * 传入角色code和权限code封装好的对象
 * 
 * 返回成功或失败提示
 * 
 * @param {Object} data - 封装好的对象
 * @param {string} data.permissionCode - 权限code
 * @param {string} data.roleCode - 角色code
 * @returns {promises} 成功或失败的提示
 */
export function addRolePermission (data) {
  return request({
    url: '/role/permission/add',
    method: 'post',
    data: {
      permissionCode: data.permissionCode,
      roleCode: data.roleCode
    }
  })
}

/**
 * 从角色删除权限
 * 
 * 传入角色code和权限code封装好的对象
 * 
 * 返回成功或失败提示
 * 
 * @param {Object} data - 封装好的对象
 * @param {string} data.permissionCode - 权限code
 * @param {string} data.roleCode - 角色code
 * @returns {promises} 成功或失败的提示
 */
export function deleteRolePermission (data) {
  return request({
    url: '/role/permission/delete',
    method: 'delete',
    data: {
      permissionCode: data.permissionCode,
      roleCode: data.roleCode
    }
  })
}